Composition Revision示例

本教程讨论 CompositionRevisions 如何工作以及如何管理复合资源(XR)更新。 本教程从定义了 “MyVPC “资源的 “Composition “和 “CompositeResourceDefinition”(XRD)开始,然后创建多个 XR 以观察不同的升级路径。 每次更新 Composition 时,crossplane 都会为创建的复合资源分配不同的 CompositionRevisions。

准备工作

安装 crossplane

安装 Crossplane v1.11.0 或更高版本,并等待 Crossplane pod 运行。

1kubectl create namespace crossplane-system
2helm repo add crossplane-master https://charts.crossplane.io/master/
3helm repo update
4helm install crossplane --namespace crossplane-system crossplane-master/crossplane --devel --version 1.11.0-rc.0.108.g0521c32e
5kubectl get pods -n crossplane-system

预期产出:

1NAME READY STATUS RESTARTS AGE
2crossplane-7f75ddcc46-f4d2z 1/1 Running 0 9s
3crossplane-rbac-manager-78bd597746-sdv6w 1/1 Running 0 9s

部署composition和 XRD 示例

应用示例 Composition。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3metadata:
 4  labels:
 5    channel: dev
 6  name: myvpcs.aws.example.upbound.io
 7spec:
 8  writeConnectionSecretsToNamespace: crossplane-system
 9  compositeTypeRef:
10    apiVersion: aws.example.upbound.io/v1alpha1
11    kind: MyVPC
12  resources:
13  - base:
14      apiVersion: ec2.aws.upbound.io/v1beta1
15      kind: VPC
16      spec:
17        forProvider:
18          region: us-west-1
19          cidrBlock: 192.168.0.0/16
20          enableDnsSupport: true
21          enableDnsHostnames: true
22    name: my-vcp

应用 XRD 示例。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: CompositeResourceDefinition
 3metadata:
 4  name: myvpcs.aws.example.upbound.io
 5spec:
 6  group: aws.example.upbound.io
 7  names:
 8    kind: MyVPC
 9    plural: myvpcs
10  versions:
11  - name: v1alpha1
12    served: true 
13    referenceable: true 
14    schema:
15      openAPIV3Schema:
16        type: object 
17        properties:
18          spec:
19            type: object 
20            properties:
21              id:
22                type: string 
23                description: ID of this VPC that other objects will use to refer to it. 
24            required:
25            - id

验证 Crossplane 是否创建了 Composition 修订版

1kubectl get compositionrevisions -o="custom-columns=NAME:.metadata.name,REVISION:.spec.revision,CHANNEL:.metadata.labels.channel"

预期产出:

1NAME REVISION CHANNEL
2myvpcs.aws.example.upbound.io-ad265bc 1 dev
Note
标签 dev 会自动从 Composition 中创建。

创建 Composition 资源

本教程有四个复合资源,涵盖不同的更新策略和composition物选择选项。 默认行为是将 XR 更新到composition物的最新修订版。 不过,可以通过在 XR 中设置 compositionUpdatePolicy: Manual 来更改。也可以使用 compositionRevisionSelector.matchLabelscompositionUpdatePolicy: Automatic 来选择带有特定标签的最新修订版。

默认更新策略

创建的 XR 未定义 “compositionUpdatePolicy”(组件更新策略)。 更新策略默认为 “Automatic”(自动):

1apiVersion: aws.example.upbound.io/v1alpha1
2kind: MyVPC
3metadata:
4  name: vpc-auto
5spec:
6  id: vpc-auto

预期产出:

1myvpc.aws.example.upbound.io/vpc-auto created

手动更新政策

使用 compositionUpdatePolicy: ManualcompositionRevisionRef 创建 Composition 资源。

1apiVersion: aws.example.upbound.io/v1alpha1
2kind: MyVPC
3metadata:
4  name: vpc-man
5spec:
6  id: vpc-man
7  compositionUpdatePolicy: Manual
8  compositionRevisionRef:
9    name: myvpcs.aws.example.upbound.io-ad265bc

预期产出:

1myvpc.aws.example.upbound.io/vpc-man created

使用选择器

创建一个 XR,其 compositionRevisionSelectorchannel: dev:

1apiVersion: aws.example.upbound.io/v1alpha1
2kind:  MyVPC
3metadata:
4  name: vpc-dev
5spec:
6  id: vpc-dev
7  compositionRevisionSelector:
8    matchLabels:
9      channel: dev

预期产出:

1myvpc.aws.example.upbound.io/vpc-dev created

创建一个 XR,其 compositionRevisionSelectorchannel: staging:

1apiVersion: aws.example.upbound.io/v1alpha1
2kind: MyVPC
3metadata:
4  name: vpc-staging
5spec:
6  id: vpc-staging
7  compositionRevisionSelector:
8    matchLabels:
9      channel: staging

预期产出:

1myvpc.aws.example.upbound.io/vpc-staging created

验证标签为 “channel: staging “的composition资源没有 “REVISION”。 所有其他 XRs 的 “REVISION “都与创建的composition修订版相匹配。

1kubectl get composite -o="custom-columns=NAME:.metadata.name,SYNCED:.status.conditions[0].status,REVISION:.spec.compositionRevisionRef.name,POLICY:.spec.compositionUpdatePolicy,MATCHLABEL:.spec.compositionRevisionSelector.matchLabels"

预期产出:

1NAME SYNCED REVISION POLICY MATCHLABEL
2vpc-auto True myvpcs.aws.example.upbound.io-ad265bc Automatic   <none>
3vpc-dev True myvpcs.aws.example.upbound.io-ad265bc Automatic map[channel:dev]
4vpc-man True myvpcs.aws.example.upbound.io-ad265bc Manual      <none>
5vpc-staging False    <none>                                  Automatic map[channel:staging]
Note
vpc-staging` XR 标签与任何现有的 Composition Revisions 不匹配。

创建新的 Composition Revisions

当创建或更新 Composition 时,crossplane 会创建一个新的 CompositionRevision。 标签和 Annotations 的更改也会触发一个新的 CompositionRevision。

更新 Composition 标签

将 “Composition “标签更新为 “channel: staging”:

1kubectl label composition myvpcs.aws.example.upbound.io channel=staging --overwrite

预期产出:

1composition.apiextensions.crossplane.io/myvpcs.aws.example.upbound.io labeled

验证 Crossplane 是否创建了新的 Composition 修订版本:

1kubectl get compositionrevisions -o="custom-columns=NAME:.metadata.name,REVISION:.spec.revision,CHANNEL:.metadata.labels.channel"

预期产出:

1NAME REVISION CHANNEL
2myvpcs.aws.example.upbound.io-727b3c8 2 staging
3myvpcs.aws.example.upbound.io-ad265bc 1 dev

验证 crossplane 是否将 Composition 资源 vpc-autovpc-staging 分配给 Composition revision:2,XRs vpc-manvpc-dev 仍分配给原来的 revision:1:

1kubectl get composite -o="custom-columns=NAME:.metadata.name,SYNCED:.status.conditions[0].status,REVISION:.spec.compositionRevisionRef.name,POLICY:.spec.compositionUpdatePolicy,MATCHLABEL:.spec.compositionRevisionSelector.matchLabels"

预期产出:

1NAME SYNCED REVISION POLICY MATCHLABEL
2vpc-auto True myvpcs.aws.example.upbound.io-727b3c8 Automatic   <none>
3vpc-dev True myvpcs.aws.example.upbound.io-ad265bc Automatic map[channel:dev]
4vpc-man True myvpcs.aws.example.upbound.io-ad265bc Manual      <none>
5vpc-staging True myvpcs.aws.example.upbound.io-727b3c8 Automatic map[channel:staging]
Note
vpc-auto 总是使用最新的 Revision。 vpc-staging 现在与被引用到 Revision revision:2 的标签相匹配。

更新成分规格和标签

更新 Composition 以禁用 VPC 中的 DNS 支持,并将标签从 “staging “改回 “dev”。

应用以下更改更新 “Composition “规格和标签:

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3metadata:
 4  labels:
 5    channel: dev
 6  name: myvpcs.aws.example.upbound.io
 7spec:
 8  writeConnectionSecretsToNamespace: crossplane-system
 9  compositeTypeRef:
10    apiVersion: aws.example.upbound.io/v1alpha1
11    kind: MyVPC
12  resources:
13  - base:
14      apiVersion: ec2.aws.upbound.io/v1beta1
15      kind: VPC
16      spec:
17        forProvider:
18          region: us-west-1
19          cidrBlock: 192.168.0.0/16
20          enableDnsSupport: false
21          enableDnsHostnames: true
22    name: my-vcp

预期产出:

1composition.apiextensions.crossplane.io/myvpcs.aws.example.upbound.io configured

验证 Crossplane 是否创建了新的 Composition 修订版本:

1kubectl get compositionrevisions -o="custom-columns=NAME:.metadata.name,REVISION:.spec.revision,CHANNEL:.metadata.labels.channel"

预期产出:

1NAME REVISION CHANNEL
2myvpcs.aws.example.upbound.io-727b3c8 2 staging
3myvpcs.aws.example.upbound.io-ad265bc 1 dev
4myvpcs.aws.example.upbound.io-f81c553 3 dev
Note
同时更改标签和规范值对于将新更改部署到 dev 频道至关重要。

验证 crossplane 是否将 Composition 资源 vpc-autovpc-dev 分配给 Composition 修订版本:3。vpc-staging 分配给修订版本:2,vpc-man 仍分配给原来的修订版本:1:

1kubectl get composite -o="custom-columns=NAME:.metadata.name,SYNCED:.status.conditions[0].status,REVISION:.spec.compositionRevisionRef.name,POLICY:.spec.compositionUpdatePolicy,MATCHLABEL:.spec.compositionRevisionSelector.matchLabels"

预期产出:

1NAME SYNCED REVISION POLICY MATCHLABEL
2vpc-auto True myvpcs.aws.example.upbound.io-f81c553 Automatic   <none>
3vpc-dev True myvpcs.aws.example.upbound.io-f81c553 Automatic map[channel:dev]
4vpc-man True myvpcs.aws.example.upbound.io-ad265bc Manual      <none>
5vpc-staging True myvpcs.aws.example.upbound.io-727b3c8 Automatic map[channel:staging]
Note
vpc-dev 与应用于修订版本 3 的更新标签相匹配。 vpc-staging 与应用于修订版本 2 的标签相匹配。